﻿using DG.Tweening;

using OfficeOpenXml;

using System.Collections.Generic;
using System.IO;

using UnityEngine;
using UnityEngine.UI;

public class Manager : MonoBehaviour
{
    public static Manager s_instance;

    public const int c_n开始年份 = 2010;
    public int m_n当前年代 = c_n开始年份;

    public Slider m_slider;
    public Text m_text当前年份;
    public Text m_text一百年前;
    public Transform m_tf22;
    public Transform m_tf65;

    public AnimationCurve m_ac年龄死亡率;
    public AnimationCurve m_ac年龄生育率;
    public AnimationCurve m_ac年代_生育率系数;

    private List<int> m_list_n年龄初始化;
    public GameObject m_obj人口单位;
    public Dictionary<int, int> m_dic_出生年_人口 = new Dictionary<int, int>();
    public Transform m_tfCamera;

    public Dictionary<int, int[]> m_dic_年_年龄人口 = new Dictionary<int, int[]>();
    public Dictionary<int, 年代管理者> m_dic_年_年代管理者 = new Dictionary<int, 年代管理者>();

    public class 年代管理者
    {
        public List<个人> m_list_当前年代 = new List<个人>();
        public int m_n当前人数
        {
            get
            {
                int v_nCount = 0;
                foreach (var item in m_list_当前年代)
                {
                    if (item != null)
                    {
                        v_nCount++;
                    }
                }
                return v_nCount;
            }
        }

        public void Add(个人 _个人)
        {
            m_list_当前年代.Add(_个人);
        }
    }

    private void Awake()
    {
        Time.timeScale = 0.5f;
        s_instance = this;
    }

    // Start is called before the first frame update
    void Start()
    {
        年龄录入();
        初始化人口单位();
    }

    private void OnApplicationQuit()
    {
        //writeExcel();
    }

    private int[] 得到年龄图()
    {
        int[] v_list_年龄_人口 = new int[101];

        foreach (var item in m_dic_年_年代管理者)
        {
            if (m_n当前年代 - item.Key <= 100)
            {
                v_list_年龄_人口[m_n当前年代 - item.Key] = item.Value.m_n当前人数;
            }
        }

        return v_list_年龄_人口;
    }

    public void 初始化人口单位()
    {
        for (int i = 0; i < m_list_n年龄初始化.Count; i++)
        {
            int v_n当前年 = c_n开始年份 - i;
            for (int j = 0; j < m_list_n年龄初始化[i] / 5; j++)
            {
                if (!m_dic_年_年代管理者.ContainsKey(v_n当前年))
                {
                    m_dic_年_年代管理者.Add(v_n当前年, new 年代管理者());
                }
                GameObject obj = Instantiate(m_obj人口单位, new Vector3(j / 2.0f, i, 0), Quaternion.Euler(0, 0, 0));
                个人 _个人 = obj.GetComponent<个人>();
                m_dic_年_年代管理者[v_n当前年].Add(_个人);
                _个人.m_n出生年份 = v_n当前年;
            }
        }
    }

    public void FixedUpdate()
    {
        if (!m_dic_年_年龄人口.ContainsKey(m_n当前年代))
        {
            m_dic_年_年龄人口.Add(m_n当前年代, 得到年龄图());
        }

        m_n当前年代++;
        m_text当前年份.text = m_n当前年代.ToString();
        m_text当前年份.transform.DOMoveY(m_text当前年份.transform.position.y - 1.0f, 0.0f, true);
        m_tf22.DOMoveY(m_tf22.position.y - 1.0f, 0.0f, true);
        m_tf65.DOMoveY(m_tf65.position.y - 1.0f, 0.0f, true);

        m_text一百年前.text = (m_n当前年代 - 100).ToString();
        m_text一百年前.transform.DOMoveY(m_text一百年前.transform.position.y - 1.0f, 0.0f, true);

        m_slider.DOKill();
        m_slider.value = 0;
        m_slider.DOValue(5.0f, 1.0f).SetEase(Ease.Linear);

        m_tfCamera.position += new Vector3(0, -1, 0);

        if (m_n当前年代 >= (c_n开始年份 + 100))
        {
            writeExcel();
#if UNITY_EDITOR
            UnityEditor.EditorApplication.isPlaying = false;
#else
            Application.Quit();
#endif
        }
    }

    public void 生育()
    {
        if (!m_dic_年_年代管理者.ContainsKey(m_n当前年代))
        {
            m_dic_年_年代管理者.Add(m_n当前年代, new 年代管理者());
        }

        if (!m_dic_出生年_人口.ContainsKey(m_n当前年代))
        {
            m_dic_出生年_人口.Add(m_n当前年代, 0);
        }

        GameObject obj = Instantiate(m_obj人口单位, new Vector3(m_dic_出生年_人口[m_n当前年代] / 2.0f, c_n开始年份 - m_n当前年代, 0), Quaternion.Euler(0, 0, 0));
        m_dic_出生年_人口[m_n当前年代] = m_dic_出生年_人口[m_n当前年代] + 1;
        个人 _个人 = obj.GetComponent<个人>();
        m_dic_年_年代管理者[m_n当前年代].Add(_个人);
        _个人.m_n出生年份 = m_n当前年代;
        _个人.零岁();
    }


    public void 年龄录入()
    {
        m_list_n年龄初始化 = new List<int>();
        m_list_n年龄初始化.Add(1034);//0
        m_list_n年龄初始化.Add(1175);//1
        m_list_n年龄初始化.Add(1172);//2
        m_list_n年龄初始化.Add(1144);//3
        m_list_n年龄初始化.Add(1142);//4
        m_list_n年龄初始化.Add(1105);//5
        m_list_n年龄初始化.Add(1111);//6
        m_list_n年龄初始化.Add(1008);//7
        m_list_n年龄初始化.Add(1025);//8
        m_list_n年龄初始化.Add(1069);//9
        m_list_n年龄初始化.Add(1085);//10
        m_list_n年龄初始化.Add(1046);//11
        m_list_n年龄初始化.Add(1155);//12
        m_list_n年龄初始化.Add(1142);//13
        m_list_n年龄初始化.Add(1193);//14
        m_list_n年龄初始化.Add(1352);//15
        m_list_n年龄初始化.Add(1410);//16
        m_list_n年龄初始化.Add(1559);//17
        m_list_n年龄初始化.Add(1557);//18
        m_list_n年龄初始化.Add(1616);//19
        m_list_n年龄初始化.Add(2103);//20
        m_list_n年龄初始化.Add(1993);//21
        m_list_n年龄初始化.Add(1836);//22
        m_list_n年龄初始化.Add(1928);//23
        m_list_n年龄初始化.Add(1700);//24
        m_list_n年龄初始化.Add(1496);//25
        m_list_n年龄初始化.Add(1479);//26
        m_list_n年龄初始化.Add(1462);//27
        m_list_n年龄初始化.Add(1675);//28
        m_list_n年龄初始化.Add(1468);//29
        m_list_n年龄初始化.Add(1420);//30
        m_list_n年龄初始化.Add(1491);//31
        m_list_n年龄初始化.Add(1461);//32
        m_list_n年龄初始化.Add(1364);//33
        m_list_n年龄初始化.Add(1552);//34
        m_list_n年龄初始化.Add(1590);//35
        m_list_n年龄初始化.Add(1719);//36
        m_list_n年龄初始化.Add(1800);//37
        m_list_n年龄初始化.Add(1856);//38
        m_list_n年龄初始化.Add(1892);//39
        m_list_n年龄初始化.Add(2056);//40
        m_list_n年龄初始化.Add(1872);//41
        m_list_n年龄初始化.Add(2028);//42
        m_list_n年龄初始化.Add(1602);//43
        m_list_n年龄初始化.Add(1802);//44
        m_list_n年龄初始化.Add(1798);//45
        m_list_n年龄初始化.Add(1752);//46
        m_list_n年龄初始化.Add(2024);//47
        m_list_n年龄初始化.Add(1506);//48
        m_list_n年龄初始化.Add(843);//49
        m_list_n年龄初始化.Add(1058);//50
        m_list_n年龄初始化.Add(963);//51
        m_list_n年龄初始化.Add(1247);//52
        m_list_n年龄初始化.Add(1377);//53
        m_list_n年龄初始化.Add(1264);//54
        m_list_n年龄初始化.Add(1321);//55
        m_list_n年龄初始化.Add(1331);//56
        m_list_n年龄初始化.Add(1208);//57
        m_list_n年龄初始化.Add(1213);//58
        m_list_n年龄初始化.Add(1028);//59
        m_list_n年龄初始化.Add(1022);//60
        m_list_n年龄初始化.Add(978);//61
        m_list_n年龄初始化.Add(846);//62
        m_list_n年龄初始化.Add(810);//63
        m_list_n年龄初始化.Add(747);//64
        m_list_n年龄初始化.Add(681);//65
        m_list_n年龄初始化.Add(648);//66
        m_list_n年龄初始化.Add(596);//67
        m_list_n年龄初始化.Add(581);//68
        m_list_n年龄初始化.Add(579);//69
        m_list_n年龄初始化.Add(554);//70
        m_list_n年龄初始化.Add(470);//71
        m_list_n年龄初始化.Add(517);//72
        m_list_n年龄初始化.Add(476);//73
        m_list_n年龄初始化.Add(456);//74
        m_list_n年龄初始化.Add(423);//75
        m_list_n年龄初始化.Add(388);//76
        m_list_n年龄初始化.Add(381);//77
        m_list_n年龄初始化.Add(319);//78
        m_list_n年龄初始化.Add(278);//79
        m_list_n年龄初始化.Add(280);//80
        m_list_n年龄初始化.Add(211);//81
        m_list_n年龄初始化.Add(207);//82
        m_list_n年龄初始化.Add(168);//83
        m_list_n年龄初始化.Add(137);//84
        m_list_n年龄初始化.Add(124);//85
        m_list_n年龄初始化.Add(101);//86
        m_list_n年龄初始化.Add(80);//87
        m_list_n年龄初始化.Add(64);//88
        m_list_n年龄初始化.Add(54);//89
        m_list_n年龄初始化.Add(42);//90
        m_list_n年龄初始化.Add(28);//91
        m_list_n年龄初始化.Add(22);//92
        m_list_n年龄初始化.Add(16);//93
        m_list_n年龄初始化.Add(12);//94
        m_list_n年龄初始化.Add(9);//95
        m_list_n年龄初始化.Add(7);//96
        m_list_n年龄初始化.Add(5);//97
        m_list_n年龄初始化.Add(4);//98
        m_list_n年龄初始化.Add(3);//99
        m_list_n年龄初始化.Add(3);//100
    }

    [ContextMenu("生育率")]
    public void 生育率()
    {
        m_ac年龄生育率.AddKey(new Keyframe(0f, 0.000000f, 0, 0, 0, 0));
        m_ac年龄生育率.AddKey(new Keyframe(14f, 0.000000f, 0, 0, 0, 0));
        m_ac年龄生育率.AddKey(new Keyframe(24f, 0.040000f, 0, 0, 0, 0));
        m_ac年龄生育率.AddKey(new Keyframe(39f, 0.000000f, 0, 0, 0, 0));
        m_ac年龄生育率.AddKey(new Keyframe(101f, 0.000000f, 0, 0, 0, 0));
    }

    [ContextMenu("Log生育率")]
    public void Log生育率()
    {
        Debug.Log(m_ac年龄生育率.keys[0].ToString());
        float v_fCount = 0;
        for (int i = 14; i < 49; i++)
        {
            v_fCount += m_ac年龄生育率.Evaluate(i);
        }
        Debug.Log(v_fCount.ToString("f6"));
    }

    [ContextMenu("死亡率")]
    public void 死亡率录入()
    {
        m_ac年龄死亡率.AddKey(0f, 0.003816f);
        m_ac年龄死亡率.AddKey(1f, 0.001113f);
        m_ac年龄死亡率.AddKey(2f, 0.000627f);
        m_ac年龄死亡率.AddKey(3f, 0.000452f);
        m_ac年龄死亡率.AddKey(4f, 0.000370f);
        m_ac年龄死亡率.AddKey(5f, 0.000333f);
        m_ac年龄死亡率.AddKey(6f, 0.000318f);
        m_ac年龄死亡率.AddKey(7f, 0.000285f);
        m_ac年龄死亡率.AddKey(8f, 0.000283f);
        m_ac年龄死亡率.AddKey(9f, 0.000282f);
        m_ac年龄死亡率.AddKey(10f, 0.000305f);
        m_ac年龄死亡率.AddKey(11f, 0.000293f);
        m_ac年龄死亡率.AddKey(12f, 0.000301f);
        m_ac年龄死亡率.AddKey(13f, 0.000294f);
        m_ac年龄死亡率.AddKey(14f, 0.000304f);
        m_ac年龄死亡率.AddKey(15f, 0.000344f);
        m_ac年龄死亡率.AddKey(16f, 0.000340f);
        m_ac年龄死亡率.AddKey(17f, 0.000390f);
        m_ac年龄死亡率.AddKey(18f, 0.000413f);
        m_ac年龄死亡率.AddKey(19f, 0.000426f);
        m_ac年龄死亡率.AddKey(20f, 0.000466f);
        m_ac年龄死亡率.AddKey(21f, 0.000472f);
        m_ac年龄死亡率.AddKey(22f, 0.000497f);
        m_ac年龄死亡率.AddKey(23f, 0.000537f);
        m_ac年龄死亡率.AddKey(24f, 0.000563f);
        m_ac年龄死亡率.AddKey(25f, 0.000583f);
        m_ac年龄死亡率.AddKey(26f, 0.000573f);
        m_ac年龄死亡率.AddKey(27f, 0.000594f);
        m_ac年龄死亡率.AddKey(28f, 0.000611f);
        m_ac年龄死亡率.AddKey(29f, 0.000681f);
        m_ac年龄死亡率.AddKey(30f, 0.000699f);
        m_ac年龄死亡率.AddKey(31f, 0.000770f);
        m_ac年龄死亡率.AddKey(32f, 0.000806f);
        m_ac年龄死亡率.AddKey(33f, 0.000828f);
        m_ac年龄死亡率.AddKey(34f, 0.000944f);
        m_ac年龄死亡率.AddKey(35f, 0.001027f);
        m_ac年龄死亡率.AddKey(36f, 0.001064f);
        m_ac年龄死亡率.AddKey(37f, 0.001135f);
        m_ac年龄死亡率.AddKey(38f, 0.001206f);
        m_ac年龄死亡率.AddKey(39f, 0.001341f);
        m_ac年龄死亡率.AddKey(40f, 0.001510f);
        m_ac年龄死亡率.AddKey(41f, 0.001553f);
        m_ac年龄死亡率.AddKey(42f, 0.001821f);
        m_ac年龄死亡率.AddKey(43f, 0.001888f);
        m_ac年龄死亡率.AddKey(44f, 0.002065f);
        m_ac年龄死亡率.AddKey(45f, 0.002314f);
        m_ac年龄死亡率.AddKey(46f, 0.002360f);
        m_ac年龄死亡率.AddKey(47f, 0.002537f);
        m_ac年龄死亡率.AddKey(48f, 0.003112f);
        m_ac年龄死亡率.AddKey(49f, 0.003281f);
        m_ac年龄死亡率.AddKey(50f, 0.003639f);
        m_ac年龄死亡率.AddKey(51f, 0.003755f);
        m_ac年龄死亡率.AddKey(52f, 0.003979f);
        m_ac年龄死亡率.AddKey(53f, 0.004413f);
        m_ac年龄死亡率.AddKey(54f, 0.004984f);
        m_ac年龄死亡率.AddKey(55f, 0.005179f);
        m_ac年龄死亡率.AddKey(56f, 0.005636f);
        m_ac年龄死亡率.AddKey(57f, 0.006094f);
        m_ac年龄死亡率.AddKey(58f, 0.006807f);
        m_ac年龄死亡率.AddKey(59f, 0.007666f);
        m_ac年龄死亡率.AddKey(60f, 0.008542f);
        m_ac年龄死亡率.AddKey(61f, 0.009377f);
        m_ac年龄死亡率.AddKey(62f, 0.010382f);
        m_ac年龄死亡率.AddKey(63f, 0.011121f);
        m_ac年龄死亡率.AddKey(64f, 0.013011f);
        m_ac年龄死亡率.AddKey(65f, 0.014211f);
        m_ac年龄死亡率.AddKey(66f, 0.014737f);
        m_ac年龄死亡率.AddKey(67f, 0.017299f);
        m_ac年龄死亡率.AddKey(68f, 0.018644f);
        m_ac年龄死亡率.AddKey(69f, 0.021914f);
        m_ac年龄死亡率.AddKey(70f, 0.025568f);
        m_ac年龄死亡率.AddKey(71f, 0.026728f);
        m_ac年龄死亡率.AddKey(72f, 0.030942f);
        m_ac年龄死亡率.AddKey(73f, 0.033591f);
        m_ac年龄死亡率.AddKey(74f, 0.037445f);
        m_ac年龄死亡率.AddKey(75f, 0.041511f);
        m_ac年龄死亡率.AddKey(76f, 0.042191f);
        m_ac年龄死亡率.AddKey(77f, 0.050969f);
        m_ac年龄死亡率.AddKey(78f, 0.056201f);
        m_ac年龄死亡率.AddKey(79f, 0.062121f);
        m_ac年龄死亡率.AddKey(80f, 0.074281f);
        m_ac年龄死亡率.AddKey(81f, 0.077907f);
        m_ac年龄死亡率.AddKey(82f, 0.085809f);
        m_ac年龄死亡率.AddKey(83f, 0.093518f);
        m_ac年龄死亡率.AddKey(84f, 0.103631f);
        m_ac年龄死亡率.AddKey(85f, 0.111000f);
        m_ac年龄死亡率.AddKey(86f, 0.118879f);
        m_ac年龄死亡率.AddKey(87f, 0.130066f);
        m_ac年龄死亡率.AddKey(88f, 0.144177f);
        m_ac年龄死亡率.AddKey(89f, 0.156873f);
        m_ac年龄死亡率.AddKey(90f, 0.176516f);
        m_ac年龄死亡率.AddKey(91f, 0.185236f);
        m_ac年龄死亡率.AddKey(92f, 0.202106f);
        m_ac年龄死亡率.AddKey(93f, 0.207349f);
        m_ac年龄死亡率.AddKey(94f, 0.208907f);
        m_ac年龄死亡率.AddKey(95f, 0.220008f);
        m_ac年龄死亡率.AddKey(96f, 0.220993f);
        m_ac年龄死亡率.AddKey(97f, 0.204840f);
        m_ac年龄死亡率.AddKey(98f, 0.198127f);
        m_ac年龄死亡率.AddKey(99f, 0.257653f);
        m_ac年龄死亡率.AddKey(100f, 0.454345f);
        m_ac年龄死亡率.AddKey(101f, 1.000000f);
    }



    private void writeExcel()
    {
        FileInfo file = new FileInfo(Application.streamingAssetsPath + "\\hello.xlsx");

        using (var package = new ExcelPackage(file))
        {
            var worksheet = package.Workbook.Worksheets["Sheet1"];

            int v_nIndex = 1;
            foreach (var item in m_dic_年_年龄人口)
            {
                worksheet.Cells[1, v_nIndex].Value = item.Key;
                for (int i = 0; i < item.Value.Length; i++)
                {
                    worksheet.Cells[i + 2, v_nIndex].Value = item.Value[i];
                }
                v_nIndex++;
            }

            package.Save();
        }
    }
}
